/**
 * @file state_machine.h
 * @brief 通用状态机框架
 */
#ifndef STATE_MACHINE_H
#define STATE_MACHINE_H
#include "sys_pub.h"

// 状态处理函数类型定义
typedef void (*StateFunc)(void);

// 状态定义结构体
typedef struct {
    int state_id;
    StateFunc enter;    // 进入状态时调用
    StateFunc process;  // 状态处理函数
    StateFunc exit;     // 退出状态时调用
} StateDef;
#define DEFINE_STATE(stateid, enter_func, process_func, exit_func) \
 { \
    .state_id = stateid, \
    .enter = enter_func, \
    .process = process_func, \
    .exit = exit_func \
}
// 状态机结构体
typedef struct {
    const StateDef* states;       // 状态表
    uint8_t state_count;          // 状态总数
    int current_state;   // 当前状态
    int target_state;    // 目标状态
    bool is_changing;             // 状态是否正在切换
} StateMachine;

// 状态定义宏 - 简化状态注册


/**
 * @brief 初始化状态机
 * @param fsm 状态机指针
 * @param states 状态表
 * @param count 状态数量
 * @param initial_state 初始状态
 */
void state_machine_init(StateMachine* fsm, const StateDef* states, uint8_t count, int initial_state);

/**
 * @brief 设置目标状态(手动状态迁移)
 * @param fsm 状态机指针
 * @param target 目标状态
 */
void state_machine_set_target(StateMachine* fsm, int target);

/**
 * @brief 获取当前状态
 * @param fsm 状态机指针
 * @return 当前状态
 */
int state_machine_get_current(StateMachine* fsm);

/**
 * @brief 状态机处理函数
 * @param fsm 状态机指针
 */
void state_machine_process(StateMachine* fsm);

#endif // STATE_MACHINE_H
    